﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SQLite;
using System.Data;
using System.Windows.Forms;

namespace MwanaDOC
{
    /// <summary>
    /// Classe genérica para o acesso a interface de dados
    /// Possui métodos que executam operações de  CRUD à interface
    /// </summary>
    public class Global
    {
        #region Static Members
        /// <summary>
        /// Endereço do arquivo de banco de dados padrão
        /// usado para criar novos arquivos de banco sempre que necessário
        /// </summary>
        public static string cleanDataFile = "data\\data.db3";

        /// <summary>
        /// O banco de dados usado pela aplicação
        /// </summary>
        public static string dataAddress = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\MwanaDOC\\Dados\\data.db3";
        /// <summary>
        /// Arquivo de log
        /// </summary>
        public static string logFileAddr = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\MwanaDOC\\Dados\\log.txt";
        
        /// <summary>
        /// Endereço padrão de backup
        /// </summary>
        public static string backupDir = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\MwanaDOC\\backup";
        /// <summary>
        /// Endereço da lixeira.Onde são salvos os arquivos apagados
        /// </summary>
        public static string lixeira = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\MwanaDOC\\lixeira";
        /// <summary>
        /// Endereço onde contém os arquivos ativos
        /// </summary>
        public static string baseDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\MwanaDOC\\Disciplinas\\";


        #endregion
        public enum opcaoBusca
        { 
            Titulo = 0,
            Professor,
            Palavra,
            Periodo
        }
        public enum Modo
        { 
            Novo,
            Atualizar
        }
        
        SQLiteConnection conn = new SQLiteConnection("Data Source = " +dataAddress);

        /// <summary>
        /// Conecta ao banco de dados
        /// </summary>
        public void conecta()
        {
            //conn.ConnectionString = "D:\\projetos\\CSharp\\MwanaDOC\\MwanaDOC\\Data Source=\\data\\data.db3";
            

            //try
            //{
                if ( conn.State != ConnectionState.Open)
                {
                conn.Open();
                }
                
            //}
            //catch (SQLiteException e) {
            //    throw new SQLiteException(e.Message);
            //}
            //catch (Exception e)
            //{
            //    throw; // new Exception(e.Message);
            //}
        }

        /// <summary>
        /// Desconecta o banco de dados
        /// </summary>
        public void desconecta()
        {
            if (conn.State == System.Data.ConnectionState.Open)
            {
                //try
                //{
                    conn.Clone();
                //}
                //catch (SQLiteException e)
                //{
                //    System.Windows.Forms.MessageBox.Show("Erro de conexão.");
                //}
                //catch (Exception e)
                //{
                //    throw new Exception(e.Message);
                //}

            }
        }

        /// <summary>
        /// Classe genérica para execução de comandos sql no banco de dados
        /// Usado para expressões sql que não retornam valor algum
        /// </summary>
        /// <param name="sql">Query String</param>
        public void executa(string sql)
        {
            this.conecta();
            try
            {
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                cmd.ExecuteNonQuery();
                
            }
            //catch (Exception e)
            //{
            //    throw new Exception(e.Message);
            //}
            finally
            {
                this.desconecta();
            }
        }

        /// <summary>
        /// Retorna um código( id ) da linha especificada
        /// </summary>
        /// <param name="sql">Query String de solicitação do código</param>
        /// <returns>String: cod</returns>
        public string getCodigo(string sql)
        {
            string cod = "0";
            string temp;
            int temp1;
            object valor;

            this.conecta();

            try
            {
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                valor = cmd.ExecuteScalar();

                if ((!valor.Equals(string.Empty)) && (valor != System.DBNull.Value))
                {
                    temp = valor.ToString();
                    temp1 = int.Parse(temp) + 1;
                    cod = temp1.ToString();
                }
                else
                    cod = "1";
            }
            //catch (Exception e)
            //{

            //    System.Windows.Forms.MessageBox.Show(e.Message);
            //}
            finally
            {
                this.desconecta();
            }

            return cod;
        }

        /// <summary>
        /// Executa uma consulta no banco de dados e retorna um DataReader com os dados
        /// solicitados
        /// </summary>
        /// <param name="sql">Query</param>
        /// <returns>reader</returns>
        public SQLiteDataReader executeReader(string sql)
        {
            SQLiteDataReader reader = null;

            //try
            //{
                this.conecta();
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                reader = cmd.ExecuteReader();
            //}
            //catch (SQLiteException er)
            //{
            //    throw new Exception(er.Message);
            //}
            //catch (Exception e)
            //{
            //    throw new Exception(e.Message);
            //}
            return reader;
        }

        /// <summary>
        /// Executa um comando no banco de dados e retorna 
        /// um resultado específico
        /// </summary>
        /// <param name="sql">Query</param>
        /// <returns>resultado</returns>
        public object executaComResultado(string sql)
        {
            object resultado;
            this.conecta();
            try
            {
                SQLiteCommand cmd = new SQLiteCommand(sql, conn);
                resultado = cmd.ExecuteScalar();
                return resultado;
            }
            //catch (Exception e)
            //{
            //    throw new Exception(e.Message);
            //}
            finally
            {
                this.desconecta();
            }
        }

        internal BindingSource getByContent(string sql)
        {
            this.conecta();

            //try
            //{
                SQLiteDataAdapter dAdapt = new SQLiteDataAdapter(sql, conn);
                SQLiteCommandBuilder cmd = new SQLiteCommandBuilder(dAdapt);
                DataTable dtDoc = new DataTable();
                BindingSource bs = new BindingSource();
                DataSet DS = new DataSet();

                dAdapt.Fill(dtDoc);
                
                bs.DataSource = dtDoc;

                return bs;
            //}
            //catch (SQLiteException e)
            //{
            //    throw new Exception("Erro na interface do banco da dados \nDetalhes: " + e.Message);
            //}
            //catch (Exception e)
            //{
            //    throw new Exception("Erro \nDetalhes: " + e.Message);
            //}
        }

        /// <summary>
        /// Retorna um dataset
        /// </summary>
        /// <param name="sql">query sql</param>
        /// <param name="tabela">o nome da tabela( será o nome do DataSet)</param>
        /// <returns>ds</returns>
        public DataSet executaDataset(string sql, string tabela)
        {
            DataSet ds = new DataSet();

            //try
            //{
                this.conecta();
                SQLiteDataAdapter dtAdap = new SQLiteDataAdapter(sql, conn);
                SQLiteCommandBuilder builder = new SQLiteCommandBuilder(dtAdap);

                dtAdap.Fill(ds, tabela);
                return ds;

            //}
            //catch (SQLiteException sqliteError)
            //{
            //    throw new SQLiteException("Erro no banco de dados.\nDetalhes: " + sqliteError.Message);
            //}
            //catch (Exception erroGeral)
            //{
            //    throw new Exception("Erro durante a operação.\nDetalhes: " + erroGeral.Message);
            //}
        }
    }
}
